package ar.uade.edu.fain.ad.server.dao.jpa;

import java.util.ArrayList;

import org.hibernate.Session;

import ar.uade.edu.fain.ad.server.business.Administrador;
import ar.uade.edu.fain.ad.server.business.DepositoCentral;
import ar.uade.edu.fain.ad.server.business.ItemDeposito;
import ar.uade.edu.fain.ad.server.business.MovimientoStock;
import ar.uade.edu.fain.ad.server.dao.DepositoCentralDAO;
import ar.uade.edu.fain.ad.server.dao.ProductoDAO;
import ar.uade.edu.fain.ad.server.dao.entity.AdministradorEntity;
import ar.uade.edu.fain.ad.server.dao.entity.DepositoCentralEntity;
import ar.uade.edu.fain.ad.server.dao.entity.ItemDepositoEntity;
import ar.uade.edu.fain.ad.server.dao.entity.MovimientoStockEntity;
import ar.uade.edu.fain.ad.server.dao.entity.ProductoEntity;

public class DepositoCentralJpaDAO extends
		GenericJpaDAO<DepositoCentral, DepositoCentralEntity, Long> implements
		DepositoCentralDAO {

	private ProductoDAO productoDAO;

	public DepositoCentralJpaDAO() {
		super(DepositoCentralEntity.class);
	}

	public ProductoDAO getProductoDAO() {
		return productoDAO;
	}

	public void setProductoDAO(ProductoDAO productoDAO) {
		this.productoDAO = productoDAO;
	}

	@Override
	protected DepositoCentral toBusiness(DepositoCentralEntity entity) {
		final DepositoCentral business = new DepositoCentral();
		business.setId(entity.getId());
		final Administrador encargado = new Administrador();
		encargado.setId(entity.getEncargado().getId());
		business.setEncargado(encargado);
		for (ItemDepositoEntity itemDepositoEntity : entity.getProductos()) {
			final ItemDeposito itemDeposito = new ItemDeposito();
			itemDeposito.setId(itemDepositoEntity.getId());
			itemDeposito.setCantidad(itemDepositoEntity.getCantidad());
			itemDeposito.setProducto(getProductoDAO().get(
					itemDepositoEntity.getProducto().getId()));
			itemDeposito.setCantidadPorVencimiento(itemDepositoEntity
					.getCantidadPorVencimiento());
			business.getProductos().add(itemDeposito);
		}
		for (MovimientoStockEntity movimientoStockEntity : entity
				.getMovimientos()) {
			final MovimientoStock movimientoStock = new MovimientoStock();
			movimientoStock.setId(movimientoStockEntity.getId());
			business.getMovimientos().add(movimientoStock);
		}
		return business;
	}

	@Override
	protected DepositoCentralEntity toEntity(DepositoCentral business) {
		DepositoCentralEntity entity;
		final Session session = getSession();
		if (business.getId() == null) {
			entity = new DepositoCentralEntity();
			entity.setMovimientos(new ArrayList<MovimientoStockEntity>());
			entity.setProductos(new ArrayList<ItemDepositoEntity>());
		} else {
			entity = (DepositoCentralEntity) session.get(
					DepositoCentralEntity.class, business.getId());
		}
		entity.setId(business.getId());
		entity.setEncargado((AdministradorEntity) session.get(
				AdministradorEntity.class, business.getEncargado().getId()));
		for (MovimientoStock movimientoStock : business.getMovimientos()) {
			final MovimientoStockEntity movimientoStockEntity = (MovimientoStockEntity) session
					.get(MovimientoStockEntity.class, movimientoStock.getId());
			entity.getMovimientos().add(movimientoStockEntity);
		}
		for (ItemDeposito itemDeposito : business.getProductos()) {
			final Long itemId = itemDeposito.getId();
			ItemDepositoEntity itemDepositoEntity = null;
			if (itemId != null) {
				itemDepositoEntity = (ItemDepositoEntity) session.get(
						ItemDepositoEntity.class, itemId);
			} else {
				itemDepositoEntity = new ItemDepositoEntity();
			}
			itemDepositoEntity.setId(itemId);
			itemDepositoEntity.setCantidad(itemDeposito.getCantidad());
			itemDepositoEntity.setCantidadPorVencimiento(itemDeposito
					.getCantidadPorVencimiento());
			itemDepositoEntity.setProducto((ProductoEntity) session.get(
					ProductoEntity.class, itemDeposito.getProducto().getId()));
			if (itemDepositoEntity.getId() == null) {
				session.save(itemDepositoEntity);
			} else {
				session.merge(itemDepositoEntity);
			}
			entity.getProductos().add(itemDepositoEntity);
		}
		return entity;
	}
}
